home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 3 / Gekikoh Dennoh Club Vol. 3 (Japan).7z / Gekikoh Dennoh Club Vol. 3 (Japan) (Track 1).bin / fsw3 / ksh / readme.x68 < prev   
Text File  |  1994-11-15  |  17KB  |  554 lines

  1. KornShell v4.9 for Human68k $Id: readme.x68,v 1.12 1994/04/30 11:35:31 homy Exp $
  2.  
  3. ● はじめに
  4.  
  5. Public Domain KornShell v4.9 を Human68k に移植しました。
  6.  
  7. ● Korn Shell とは
  8.  
  9. 歴史的なことはよく知りません。いま流行(!?)の System V に由来するようで
  10. す。
  11.  
  12. 機能的には Bourne Shell + α といったところでしょうか。ヒストリ機能や
  13. 変数評価、ジョブ制御、コマンドライン編集などが強化されているようです。
  14. GNU の Bourne Again Shell(bash)の手本にもなったようです。
  15.  
  16. ● Version 4.5 との違い
  17.  
  18. 本 PD ksh のバージョンは 4.9 です。以下に v 4.5 からの変更点を述べます。
  19.  
  20. 1 コマンドライン編集
  21.  
  22. o 補完できるところまで補完してから、候補一覧を表示する complete-list が
  23. 追加された(デフォルトでESC = にバインドされている)。
  24.  
  25. 2 シェル本体の機能
  26.  
  27. o FCEDIT, COLUMNS を特殊変数として扱うようになった。これらの変数への代入
  28. は、即座に ksh 内部に反映されるようになった。
  29.  
  30. o リダイレクト先にワイルドカードが使えるようになった。
  31.  
  32. 例:
  33. カレントディレクトリに foo bar baz というファイルがある場合、
  34.  
  35.     echo message > f*
  36.  
  37. は echo の結果が foo にリダイレクトされる。
  38.  
  39.     echo message > b*
  40.  
  41. は echo の結果を b* というファイルに出力しようとするが、Human68k は * を
  42. ファイル名に含むことができないので、失敗する。
  43.  
  44. o ビルトイン select コマンドが追加された(ksh.man 参照)。
  45.  
  46. スクリプト例:
  47. #! /bin/ksh
  48. cpus='68000 68EC030 68030 68040 8086 80286 i386 i486'
  49. PS3="What is your machine's CPU type? "
  50. select choice in $cpus; do
  51.     case $choice in
  52.     68*)    echo "モトローラ($choice)入ってる。";;
  53.     *86)    echo "インテル($choice)入ってる。";;
  54.     esac    
  55. done
  56.  
  57. 実行例:
  58.  
  59. 1) 68000   
  60. 2) 68EC030 
  61. 3) 68030   
  62. 4) 68040   
  63. 5) 8086    
  64. 6) 80286   
  65. 7) i386    
  66. 8) i486    
  67. What is your machine's CPU type? 3
  68. モトローラ(68030)入ってる。
  69. What is your machine's CPU type? 8
  70. インテル(i486)入ってる。
  71. What is your machine's CPU type? ^Z
  72.  
  73.  
  74. ● Human68k 版
  75.  
  76. 1 制限、バグ
  77.  
  78. o ジョブ制御機能はありません。
  79.  
  80. o 一部コマンドはダミーです。エラーにはなりませんが機能していません。
  81.   umask, ulimit, kill, times, jobs
  82.  
  83. o 一部機能は本物と挙動が異なります。
  84.   wait は待つものがありません。wait() の値を持って即座に復帰します。
  85.   trap でシグナル番号として 2 や INT 以外を指定しても無視します。
  86.  
  87. o () や `` のように本来別プロセスで実行されるべきコマンドも同一のシェ
  88. ル上で実行します。このため () や `` 内で定義あるいは変更した alias は、
  89. () や `` 内の実行を終了した後もそのまま残ります。ただし、変数や関数は
  90. 残らないようにしています。
  91.  
  92. o 行編集の vi モードは、需要がほとんどないだろうという勝手な推測と、日
  93. 本語対応にするのが面倒そうという実用的な理由により Human68k 版では組み
  94. 込んでいません。
  95.  
  96. o メールの着信通知機能は外してあります。組み込むのは簡単ですが、無駄だ
  97. と思いますので。要望が多ければいつでも組み込みます。
  98.  
  99. o 組み込み exec コマンドがそれらしく動くようになっています。単純にコマ
  100. ンド実行が終わったら exit するだけですが。。
  101.  
  102. o 変数 KSH_VERSION の形式が微妙に異なります。オリジナルでは
  103.  
  104.     @(#)PD KSH v4.5 92/04/25
  105.  
  106. ですが、Human68k 版では
  107.  
  108.     @(#)PD KSH v4.5(X6_1) May 3 1992
  109.  
  110. となります。バージョン番号に "(X6_?)" が追加され、日付のフィールドのフォ
  111. ーマットも違っています。特に不都合はないと思います。移植性を考慮したシェ
  112. ルスクリプトを書きたい場合は、以下のようにします。
  113.  
  114. case "$KSH_VERSION" in
  115. *X6*) # Human68k 版のとき
  116.     :
  117.     :
  118.     ;;
  119. *)    # Human68k 版ではないとき
  120.     :
  121.     :
  122.     ;;
  123. esac
  124.  
  125.  
  126. 2 独自機能
  127.  
  128. o ksh が実行可能とみなすファイルは
  129.  
  130. 1) ファイル属性の第 7 bit が立ったもの
  131. 2) 拡張子が .r のもの
  132. 3) 拡張子が .z のもの
  133. 4) 拡張子が .x のもの
  134. 5) 拡張子が .sh のもの
  135. 6) 拡張子が .bat のもの
  136.  
  137. です。検索は上記の 1) ~ 6) の順に行われます。ただし、2) ~ 6) の条件
  138. を満たしておらず、1) のみを満たしているファイルで、正しく実行できるの
  139. は .x 形式のファイルとスクリプトファイルです。1) のみを満たす .x 形式
  140. のファイルを実行させるには execd (沖@沖氏作) が必要です。
  141.  
  142. o コマンドライン編集でキーにアサインできる機能として以下のものが追加さ
  143. れています。
  144.  
  145.   delete-char-forward-or-list-file-or-eot
  146.   delete-char-forward-or-list-file
  147.   clear-and-redraw
  148.   previous-match
  149.   next-match
  150.   nop
  151.   complete-variable
  152.   list-variable
  153.  
  154. このうち clear-and-redraw は ^L にアサインされています。
  155. delete-char-* は fish のパクリです。
  156. previous-match、next-match は Human68k 版 GNU readline、fish、tcshなど
  157. でおなじみのコマンドラインに入力されている文字列とマッチするヒストリを
  158. 検索する機能です。
  159. nop は no-op の別名です。
  160. complete-variable、list-variable は変数名を補完する機能です。デフォルト
  161. で ESC-ESC にバインドされている complete や ESC-? にバインドされている
  162. list も拡張されていて、`$' で始まる単語は変数とみなして補完します。
  163.  
  164. o オプション autocolumns をセットする(set -o autocolumns)ことで、コマン
  165. ドを実行する都度、変数 COLUMNS が画面の幅にセットされます。画面幅の獲得
  166. には IOCS コールの B_CONSOL を用いています。export COLUMNS することで、
  167. ITA TOOLBOX の ls などに正しい画面幅を伝えることができます。
  168.  
  169. o 行編集機能における画面の幅の判断はオプション usecolumns によって制御
  170. できます。usecolumns がセットされている(set -o usecolumns)ときは、変数
  171. COLUMNS の値を画面の幅とみなして動作します。usecolumns がセットされてい
  172. ない場合は、ksh が画面の幅を自動的(B_CONSOL を用いて)に判断します。
  173. SX-WINDOW や Ko-Window 上で ksh を用いる場合は、usecolumns をセットして
  174. おき、COLUMNS にウィンドウの幅を設定して使うと良いでしょう。
  175.  
  176. o 行編集において、行頭で delete-char-backward(^H) や backward-char(^B)
  177. を実行したり、行末で、forward-char(^F) を実行してもベルを鳴らさないよ
  178. うにしました。オリジナルの PD ksh と同様に戻したい場合はオプション
  179. noisyedit をセット(set -o noisyedit)してください。
  180.  
  181. o オプション meta を設定する(set -o meta)と、X68000 本体の OPT.1 キー
  182. をメタキーとして認識するようになります。例えば、OPT.1+f で M-f にバイ
  183. ンドされた行編集コマンドが実行されます。
  184.  
  185. o オプション ctlspc を設定する(set -o ctlspc)と、CTRL+` '(スペース)ま
  186. たは CTRL+`@' を認識するようになります。
  187.  
  188. o オプション rmstar をセットする(set -o rmstar)と、`rm *' が実行される
  189. 前に確認を求めてくるようになります。
  190.  
  191. o デフォルトの値として参照する /etc/profile、/bin/sh、/bin/command、
  192. /tmp は変数 SYSROOT の値を参照してアクセスします。SYSROOT が設定してあ
  193. れば、上記についてはそれぞれ $SYSROOT/etc/profile、$SYSROOT/bin/sh、
  194. $SYSROOT/bin/sh、 $SYSROOT/bin/command、$SYSROOT/tmp がアクセスされま
  195. す。ただし、上記のデフォルト値は /etc/profile を除いて、それぞれ以下の
  196. ような変数の値が優先します。
  197.  
  198. デフォルト値    変数名
  199. ---------------------------------------
  200. /bin/sh        EXECSHELL, SHELL
  201. /bin/command    COMSPEC
  202. /tmp        temp
  203.  
  204.  
  205. o オプション refersysroot を設定する(set -o refersysroot)と、cd とコマ
  206. ンド検索時に、`/' で始まるパスは $SYSROOT/ で始まるものとみなすように
  207. した(cd /bin は cd $SYSROOT/bin とみなす。PATH=/bin なら PATH=a:/bin 
  208. とみなす)。また、ksh が起動する外部コマンドへの環境変数 path は 
  209. $SYSROOT を先頭に追加した要素から構成されるようになる(PATH=/bin と設定
  210. してある場合、path=$SYSROOT/bin となる)
  211.  
  212. o 起動時に -0 または -l オプションを指定するとログインシェルと同様に動作
  213. します。すなわち、起動時に $SYSROOT/etc/profile, ~/.profile を実行します。また
  214. set -l が暗黙に実行されます。
  215.  
  216. o 漢字にある程度対応しました。問題ない程度には使えると思います。
  217.  
  218. o set -o nodups とすることで、直前に実行したものと同じコマンドはヒスト
  219. リに格納しなくなります。
  220.  
  221. o スクリプトファイルの先頭が #! で始まるときは #! の直後に書いていある
  222. ものをインタプリタ名として解釈し、実行します。このとき PATH による検索
  223. を行います。これによって、
  224.  
  225.     #! sed -f
  226.     s/foo/bar/g
  227.  
  228. のような内容のファイル foo.sh を作っておいて PATH 上に置いて
  229.  
  230.     foo datafile
  231.  
  232. とすると、sed -f foo.sh datafile のようにコマンドが起動されます。なお、
  233. インタプリタに渡せる引数(上の例では -f)は1つだけです。
  234.  
  235. なお、Human68k の DOS _EXEC が execd などによってスクリプトを実行でき
  236. るように拡張されている場合は、まず DOS _EXEC により実行を試み、それが
  237. 失敗したときに限り上記の動作を行います。
  238.  
  239. o 変数 PERIOD_VAR に 0 以外の整数をセットすると、変数名にピリオド(.)が
  240. 使えるようになります。
  241.  
  242. o コマンドラインが長くなってもできるだけ正しく引数をコマンドに渡そうと
  243. します。実行するコマンドが HUPAIR 適合なら、引数は正しく渡されます。実
  244. 行するコマンドが HUPAIR 適合でない場合は、変数 HUGEARG を見てその設定
  245. に従います。
  246.  
  247.     1) HUGEARG=indirect または未設定
  248.        引数を格納した中間ファイルを作り、引数として
  249.            -+-+-中間ファイル名
  250.        を渡します。
  251.     2) HUGEARG="indirect <文字列>"
  252.        引数を格納した中間ファイルを作り、引数として
  253.            <文字列>中間ファイル名
  254.        を渡します。
  255.     3) HUGEARG=force
  256.        引数をそのまま渡して実行します。
  257.     4) それ以外
  258.        実行をあきらめます。
  259.  
  260. o 組み込みステートメント `noencode' を追加しました。
  261.  
  262. noencode command [args...]
  263.  
  264.     command を実行します。起動される command には引数リスト args
  265.     を単一の空白 ` ' によって連結した文字列を HUPAIR エンコードせ
  266.     ずに渡します。command が builtin コマンドの場合は意味がありま
  267.     せん。
  268.  
  269. 例えば、通常
  270.  
  271.     foo -s\"pi\" C_1.GF
  272.  
  273. のようにコマンドを実行すると、foo には HUPAIR エンコードされた引数文字
  274. 列「'-s"pi"' C_1.GF」が渡されます。noencode ステートメントを使って次の
  275. ようにすると、
  276.  
  277.     noencode foo -s\"pi\" C_1.GF
  278.  
  279. foo には文字列「-s"pi" C_1.GF」が渡されます。引数中の ' や " に特殊な解
  280. 釈を行うコマンドの実行に便利です。そのようなコマンドは 
  281.  
  282.     alias foo='noencode foo' 
  283.  
  284. のように alias 定義しておくとなお便利でしょう。
  285.  
  286. o 組み込みステートメント `noglob を追加しました。
  287.  
  288. noglob command [args...]
  289.  
  290.        command を実行します。起動されるコマンドの引数リストにおいてファ
  291.        イル名展開は行いません。一時的に set -o noglob したのとほぼ同様
  292.        の効果が得られます。
  293.  
  294. noglob は ksh にファイル名展開を行わせず、実行するコマンドにファイル名
  295. 展開を任せたいときなどに使用します。例えば、
  296.  
  297.        alias ren='noglob command ren'
  298.  
  299. のようなエイリアス定義をしておくと、command と同様の感覚で ren コマン
  300. ドが使えます。
  301.  
  302. o オリジナルでは pwd は alias で print -r "$PWD" と定義されていますが、
  303. Human68k 版では本物の builtin コマンドです。$PWD の値と pwd で表示される
  304. 値は以下の例のように異なることがあります。
  305.  
  306. $ pwd
  307. a:/
  308. $ ls -lF
  309. d---rwx       0 Jun  7 1992 19:07 bin/
  310. la--rwx       3 Jun  7 1992 20:39 foo -> bin/bar
  311. $ cd foo    # シンボリックリンクに cd
  312. $ pwd        
  313. a:/bin/bar    # 本当のディレクトリ名を表示
  314. $ echo -r "$PWD"
  315. a:/foo        # 見かけ上のディレクトリ名を表示
  316. $ cd ..
  317. $ pwd
  318. a:/        # cd コマンドは見かけ上のディレクトリを移動する
  319.  
  320. o csh ライクな {..,..} の展開ができます。set -o expandbrace すると、以下
  321. の用に展開されます。
  322.  
  323. $ echo Makefile.{1,2}
  324. Makefile.{1,2}
  325. $ set -o expandbrace
  326. $ echo Makefile.{1,2}
  327. Makefile.1 Makefile.2
  328. $ echo test.c{,.bak}
  329. test.c test.c.bak
  330. $ ls
  331. alloc.c    alloc.o    Makefile
  332. $ echo a{l,b}*
  333. alloc.c alloc.o ab*
  334.  
  335. {..,..} 展開は存在するファイルに関係なく行います。また、*?[] のワイルド
  336. カード展開に先だっておこないます。
  337.  
  338. オリジナルの PD ksh では v4.6 から {..} の展開を行うようになっているの
  339. ですが、{..} 展開の後にワイルドカード展開等を行わず不便なので、v4.6 で
  340. 追加されたコードは使用していません。
  341.  
  342. o 組み込みコマンドの print に -R オプションが追加されています。意味は
  343. 以下の通りです。
  344.  
  345.     -R    `\' によるエスケープシーケンスを解釈しない。また、以降
  346.         に -n 以外のオプションがあってもそれを通常の引数と同様
  347.         に扱う。
  348.  
  349. また、組み込みエイリアスが echo=print から echo='print -R'に変更されて
  350. います。このため、echo によって `\t' のような `\' を使ったエスケープシー
  351. ケンスが解釈されることはありません。
  352.  
  353. o クォートされていない `=' で始まる単語に対して特殊な置換を行います。
  354. `=' より後の単語を外部コマンド名であるとみなして検索し、見つかった場合
  355. はそのフルパスに置換されます。見つからなかった場合はその単語のまま残り
  356. ます。
  357.   オプション `noequals' をセットすることにより、この置換を行わせなくす
  358. ることができます。
  359.  
  360. 例:
  361.     PATH 上に a:/usr/local/bin/less.x というコマンドのみがあるとすると、
  362.  
  363.     $ echo =less
  364.     a:/usr/local/bin/less.x
  365.     $ echo =foo
  366.     =foo
  367.     $ echo '=less'
  368.     =less
  369.     $ set -o noequals
  370.     $ echo =less
  371.     =less
  372.  
  373. 3 その他
  374.  
  375. o 本プログラムには SHARP XC Version 1 のライブラリがリンクしてあります。
  376.  
  377. o 起動時に環境変数エリアがないとアドレスエラーになります(XC v1 のスター
  378. トアップルーチンがこのような状況を考慮していないためです)。CONFIG.SYS 
  379. の SHELL= や PROGRAM= で ksh を指定するときは、CONFIG.SYS で 
  380. ENVSET=256 のように指定して環境変数エリアを確保してください。
  381.  
  382. o コマンド検索はあまり速くありません。起動時に -h オプションを付けるか
  383. 起動後に set -h することで、一度実行したコマンドは覚えておくようになり
  384. ます。すこしは快適に使えるはずです。
  385.  
  386. o バッチファイルの実行をサポートしています。.bat の拡張子を持つファイ
  387. ルは変数 COMSPEC で示されるプログラムまたは $SYSROOT/bin/command に渡して
  388. 実行しようとします。command.x が a:/bin 以外にある人は COMSPEC を設定
  389. するようにしてください。
  390.  
  391. 例:
  392.     COMSPEC='a:/human/command.x'
  393.  
  394. o ksh から起動されるプロセスに渡す環境変数領域に余地を残すことができま
  395. す。これにより COMSPEC='a:/human/command.x' のように /e: オプションを
  396. 指定しなくても、バッチファイル中で環境変数の操作ができるようになります
  397. (`環境のためのメモリが足りません' と言われなくなります)。
  398.  
  399. 環境変数領域の余地は変数 ENVMARGIN で指定します。ENVMARGIN には 10 進
  400. 整数でバイト数を指定します。
  401.  
  402. 例:
  403.     ENVMARGIN=512    # 512 バイト余地を確保する
  404.  
  405. o fish と同じ malloc ルーチン(Extmalloc)を組み込んでいます。シェルの上
  406. で常駐プログラムを実行してもメモリが足りないといって死ぬことがなくなり
  407. ました。
  408.  
  409. o ksh は起動時に環境変数 ENV で示されるファイルを実行します。ENV の値
  410. として ~/.kshrc などを指定して、~/.kshrc に初期設定を書いておくと良い
  411. でしょう。おまけの項に私が使っている .kshrc を付けておきますので参考に
  412. どうぞ。なお、ログインシェルの場合 $ENV で示されるファイルの実行は 
  413. /etc/profile や ~/.profile の後になります。すなわち、~/.profile で
  414.  
  415.     export ENV=~/.kshrc
  416.  
  417. のようにしておくことで、.profile 実行後および、以降に ksh が起動
  418. されるたびに ~/.kshrc が実行されるようにできます。
  419.  
  420. ● マニュアル、参考書について
  421.  
  422. o 添付してある ksh.man はすでに groff によりフォーマット済みです。バック
  423. スペースはボールド文字や、アンダーラインを表現しています。
  424.  
  425.     a^Ha が `a' のボールド文字を
  426.     _^Ha が `a' にアンダーラインをつけたものを
  427.  
  428. それぞれ表現しています。
  429.  
  430. このようなテキストは less を使うと普通に読むことができます。less 上で
  431. これらの修飾つき文字検索する場合は less -i や less を起動後に -i を入
  432. 力してから行ないます。
  433.  
  434. less 以外でも読めるようにするには、
  435.  
  436.     sed 's/.^H//g' ksh.man > output
  437.  
  438.     (^H の部分は本当のバックスペースを入れます)
  439.  
  440. とか、GNU Emacs 上なら replace-regexp や nuke-nroff-bs (man.el) で、
  441. MicroEMACS なら MAGIC モードで同様に置換します。
  442.  
  443. o ksh.man は完全なマニュアルではなく、主に Bourne Shell からの違いにつ
  444. いてのみ解説してあります。KornShell の完全な仕様は
  445.  
  446.     『The KornShell -- Command and Programming Language』
  447.     AT&T Bell Laboratories
  448.  
  449.     邦訳
  450.     『Kornシェル コマンド言語とプログラミング言語』 啓学出版
  451.  
  452. に書いてあります。ただし PD KornShell は KornShell のすべての機能を網
  453. 羅しているわけではありません。
  454.  
  455. Bourne Shell に関しては
  456.  
  457.     『UNIX step by step』 たぶん啓学出版
  458.  
  459. に書いてあるそうです。残念ながら私は読んだことがありません。
  460.  
  461.     『UNIX シェルプログラミング』 CQ 出版
  462.  
  463. という本には、Bourne Shell と C Shell の両方が解説されています。
  464.  
  465. また、フリーなチュートリアルドキュメントとして 『Bourne Shell 自
  466. 習テキスト』というものがあります。日経 MIX が元で、NIFTY Serve 
  467. の FSHARP3 にも転載されています。LaTeX で記述されています。
  468.  
  469. ● 配布など
  470.  
  471. 元は Public Domain ですが、Human68k 版への改変部分は私の著作物です。
  472. Human68k 版 ksh は Public Domain ではありません。配布は GNU GENERAL
  473. PUBLIC LICENSE の Version 2 に従ってください。詳しくはアーカイブ中の 
  474. COPYING をご覧ください。
  475.  
  476. ● 連絡先
  477.  
  478. 質問、ご意見、ご要望などは以下まで。
  479.  
  480. homy: PEKIN-NET
  481. pcs30830: ASCII NET
  482. yhori@trl.mei.co.jp: Internet
  483.  
  484. ● おまけ
  485.  
  486. 以下は私が以前使っていた ~/.profile と ~/.kshrc です。当時はログインシェ
  487. ルとしては fish を使っていたので環境変数の設定は手抜きです。alias や 
  488. bind で = を使うことに注意しましょう。
  489.  
  490. ~/.profile
  491. ---------------------------------------------------------------------------
  492. PATH="a:/users/homy/bin;a:/tmp/bin;a:/usr/local/bin;a:/usr/local/bin/sh;\
  493. a:/usr/gnu/bin;a:/usr/bin;a:/usr/local/gr;a:/usr/local/jokes;\
  494. a:/usr/local/sound;a:/usr/local/lib/perl;a:/usr1/sys/free;a:/human;\
  495. a:/usr1/sys;a:/usr/local/bat;a:/usr1/games;a:/etc"
  496.  
  497. ENV=~/.kshrc
  498.  
  499. export PATH ENV
  500.  
  501. # 本来ならその他諸々の環境変数の設定が続く
  502.  
  503. if [ x"$KSH_VERSION" != x ]; then
  504.     set -o ignoreeof
  505. fi
  506. ---------------------------------------------------------------------------
  507. ~/.kshrc
  508. ---------------------------------------------------------------------------
  509. set -h -o refersysroot
  510. HUGEARG=indirect
  511.  
  512. case "$-" in
  513. *i*)    # インタラクティブシェルなら以下を実行
  514.     set -o emacs -o nodups -o expandbrace
  515.  
  516.     CDPATH=";$HOME;$HOME/lib;$HOME/src;a:/usr/local;\
  517. a:/usr/local/src;a:/usr/local/lib;a:/usr1;a:/usr1/data;a:/usr1/com;a:/usr1/doc"
  518.     COMSPEC='a:/human/command.x /e:50'
  519.  
  520.     bind ^D=delete-char-forward-or-list-file-or-eot
  521.     bind ^C=abort
  522.     bind ^I=complete
  523.     bind ^P=previous-match
  524.     bind ^N=next-match
  525.     bind ^[^Y=prev-hist-word
  526.     bind ^Q=quote
  527.  
  528.     alias more=less
  529.     alias vi=stevie
  530.     alias which=whence
  531.     alias cp='cp -i'
  532.     alias mv='mv -i'
  533.     alias man=sman
  534.     alias bye=exit
  535.     alias ne=nemacs
  536.     cd() {
  537.         builtin cd $*
  538.         pwd
  539.     }
  540.     see() {
  541.         ss -p0
  542.         a:/usr/local/bin/see $*
  543.         ss -p1
  544.     }
  545.     cram() {
  546.         umount /tmp
  547.         a:/usr/local/bin/cram $*
  548.         mount /tmp
  549.     }
  550. ;;
  551. esac
  552. ---------------------------------------------------------------------------
  553.